package interface1;

/**
 * 基础知识-接口
 *
 * @author cctv
 */
public class InterfaceTest {

    public static void main(String[] args) {
        // 对象 f1 和 f2 是 Figure 接口引用类型。接口 Figure 中声明了成员变量，它是静态成员变量，访问name静态变量
        Figure f1 = new Triangle();
        f1.onDraw();
//        System.out.println(f1.name); // idea 会出现红线 提示改成下面的写法
        System.out.println(Figure.name);
        // f2变量是父类类型，指向子类实例，发生多态
        Figure f2 = new Ellipse();
        f2.onDraw();

        // 接口与抽象类一样都不J能被实例化。

        // Java 8 新特性默认方法和静态方法
        System.out.println(f1.methodA());
        System.out.println(f1.methodB());
        System.out.println(Figure.methodC());


        // 划重点！！！
        // 抽象类与接口区别
        // 1.接口支持多继承，而抽象类（包括具体类）只能继承一个父类。
        // 2. 接口中不能有实例成员变量，接口所声明的成员变量全部是静态常量，即便是变量不加 public static final 修饰符也是静态常量。抽象类与普通类一样各种形式的成员变量都可以声明。
        //3. 接口中没有包含构造方法，由于没有实例成员变量，也就不需要构造方法了。抽象类中可以有实例成员变量，也需要构造方法。
        //4. 抽象类中可以声明抽象方法和具体方法。Java 8 之前接口中只有抽象方法，而 Java8 之后接口中也可以声明具体方法，具体方法通过声明默认方法实现

        //提示 学习了接口默认方法后，有些读者还会有这样的疑问，Java 8之后接口可以声明抽象
        //方法和具体方法，这就相当于抽象类一样了吗？在多数情况下接口不能替代抽象类，
        //例如当需要维护一个对象的信息和状态时只能使用抽象类，而接口不行，因为维护一
        //个对象的信息和状态需要存储在实例成员变量中，而接口中不能声明实例成员变量
    }
}

